package processor

import (
	"fmt"
	"h1/tcpdemo/common/message"
	"h1/tcpdemo/common/tcpModel"
)

// 服务器端方法================================================
// 因为UserMgr 实例在服务器端有且只有一个
// 因为在很多的地方，都会使用到，因此，我们
// 将其定义为全局变量
var (
	userMgr *UserMgr
)

type UserMgr struct {
	onlineUsers map[int]*UserProcess
}

// 完成对userMgr初始化工作
func init() {
	userMgr = &UserMgr{
		onlineUsers: make(map[int]*UserProcess, 1024),
	}
}

// 完成对onlineUsers添加
func (this *UserMgr) AddOnlineUser(up *UserProcess) {
	this.onlineUsers[up.UserId] = up
}

// 删除
func (this *UserMgr) DelOnlineUser(userId int) {
	delete(this.onlineUsers, userId)
}

// 返回当前所有在线的用户
func (this *UserMgr) GetAllOnlineUser() map[int]*UserProcess {
	return this.onlineUsers
}

// 根据id返回对应的值
func (this *UserMgr) GetOnlineUserById(userId int) (up *UserProcess, err error) {

	//如何从map取出一个值，带检测方式
	up, ok := this.onlineUsers[userId]
	if !ok { //说明，你要查找的这个用户，当前不在线。
		err = fmt.Errorf("用户%d 不存在", userId)
		return
	}
	return
}

// 客户端=================================================================

// 客户端要维护全局的map
var OnlineUsers = make(map[int]*message.User, 10)
var CurUser tcpModel.CurUser //我们在用户登录成功后，完成对CurUser初始化

// 在客户端显示当前在线的用户
func OutputOnlineUser() {
	//遍历一把 onlineUsers
	fmt.Println("当前在线用户列表:")
	for id, _ := range OnlineUsers {
		//如果不显示自己.
		fmt.Println("用户id:\t", id)
	}
}

// 编写一个方法，处理返回的NotifyUserStatusMes
func UpdateUserStatus(notifyUserStatusMes *message.NotifyUserStatusMes) {

	//适当优化
	user, ok := OnlineUsers[notifyUserStatusMes.UserId]
	if !ok { //原来没有
		user = &message.User{
			UserId: notifyUserStatusMes.UserId,
		}
	}
	user.UserStatus = notifyUserStatusMes.Status
	OnlineUsers[notifyUserStatusMes.UserId] = user

	OutputOnlineUser()
}
